package com.fau.wmbj.server.storage;

import com.fau.wmbj.server.utils.Message;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

/**
 * Service - 文件
 *
 * @author jiawei
 * @version 1.0
 * @datetime 2019/7/29 10:42
 **/
public interface StorageService {

    /**
     * 文件验证
     *
     * @param multipartFile 上传文件
     * @return 文件验证是否通过
     */
    boolean isValid(MultipartFile multipartFile);

    /**
     * 上传文件
     *
     * @param multipartFile 文件
     * @param tableName     表名
     * @param tableId       表id
     * @param open          是否公公开
     * @param async         是否异步
     * @return com.fau.yk.entity.FileDetail
     * @author jiawe
     * @datetime 2020/1/18 14:21
     **/
    StorageDirectory upload(MultipartFile multipartFile, String tableName, Long tableId, boolean open, boolean async) throws Exception;

    /**
     * 上传文件-生成预览文件
     *
     * @param file       文件
     * @param preview    是否生成预览文件
     * @param tableName  表名
     * @param tableId    表id
     * @param async      是否异步
     * @param chunk      当前片数
     * @param chunkCount 总分片数
     * @return com.fau.yk.entity.FileDetail
     * @author jiawe
     * @datetime 2020/1/18 14:21
     **/
    Message uploadChunk(MultipartFile file, Boolean preview, String tableName, Long tableId, String fileMd5, Integer chunk, Integer chunkCount, Integer chunkSize, boolean async) throws Exception;

    /**
     * 文件上传
     *
     * @param file     上传文件
     * @param fileType 文件类型
     * @param async    是否异步
     * @param open     是否存储在开放空间
     * @return 存储路径
     */
    String upload(File file, String fileType, boolean async, boolean open) throws Exception;

    /**
     * 文件上传base64
     *
     * @return 文件详情
     */
    StorageDirectory uploadBase64(String imgType, String file, String tableName, Long tableId, boolean async) throws IOException;

    /**
     * 文件上传(异步)
     *
     * @param multipartFile 上传文件
     * @param open          是否存储在开放空间
     * @return 访问URL
     */
    StorageDirectory upload(MultipartFile multipartFile, String tableName, Long tableId, boolean open) throws Exception;

    /**
     * 文件上传(异步)
     *
     * @param multipartFile 上传文件
     * @return 访问URL
     */
    String upload(MultipartFile multipartFile) throws Exception;

    /**
     * 文件上传至本地(同步)
     *
     * @param multipartFile 上传文件
     * @return 路径
     */
    String uploadLocal(MultipartFile multipartFile);

    /**
     * 删除文件
     *
     * @param url             文件路径
     * @param groupId         所属存储桶
     * @param async           是否异步
     * @param storagePluginId 存储方式
     * @return boolean
     * @author jiawe
     * @datetime 2020/1/11 20:00
     **/
    boolean delete(String url, String groupId, String storagePluginId, boolean async);

    /**
     * 删除
     *
     * @author jiawei
     * @datetime 2020-07-06 14:05
     */
    void delete(StorageDirectory fileDetail, boolean async);

    /**
     * 下载
     *
     * @param fileDetail 文件详情
     * @param isPreview  是否下载预览
     * @author jiawei
     * @datetime 2020-07-07 10:12
     */
    InputStream download(StorageDirectory fileDetail, Boolean isPreview) throws IOException;

    /**
     * 获取查看链接
     *
     * @param fileDetail 文件信息
     * @param timeOut    有效期
     * @author jiawei
     * @datetime 2020-07-07 10:31
     */
    String getUrl(StorageDirectory fileDetail, boolean isPreview, int timeOut);

    /**
     * 清理缓存文件
     *
     * @author jiawei
     * @datetime 2020-07-15 21:12
     */
    void clearTempFile();

}